package com.prj.ufdm.cloud.ms.auth.bpo._impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONObject;
import com.prj.ufdm.cloud.ms.auth.bpo.SysFunctionBPO;
import com.prj.ufdm.cloud.ms.auth.dao.SysFunctionDao;
import com.prj.ufdm.cloud.ms.auth.dao.SysRoleFunctionDao;
import com.prj.ufdm.cloud.ms.auth.enums.FuntionTypeEnum;
import com.prj.ufdm.cloud.ms.auth.model.SysFunction;
import com.prj.ufdm.cloud.ms.core.bpo._impl.BaseBPOImpl;

/**
 * DESC: 系统功能管理 <br>
 * @author 胡义振
 * @date 2020年1月14日
 */
@Service 
public class SysFunctionBPOImpl extends BaseBPOImpl<SysFunctionDao,SysFunction> implements SysFunctionBPO{
	
    @Autowired
    private SysFunctionDao sysFunctionDao;
    
    @Autowired
    private SysRoleFunctionDao sysRoleFunctionDao;
    
    /**
	 * DESC： 查询所有功能信息
	 * @auther 胡义振
	 * @param userId 用户ID
	 * @return 用户资源列表
	 * @throws Exception
	 */
    @Override
	public List<SysFunction> doGetFunctionList(SysFunction sysFunction) throws Exception
	{
		return sysFunctionDao.selectList(sysFunction);
	}
	
	
	/**
	 * DESC： 根据角色ID，查询角色的功能
	 * @auther 胡义振
	 * @param roleId 角色ID
	 * @return 
	 * @throws Exception
	 */
    @Override
	public List<SysFunction> doGetFunctionListByRoleId(String roleId) throws Exception
	{
		Map<String,String> map = new HashMap<String,String>();
		map.put("roleId", roleId);
		return sysFunctionDao.selectFunctionListByRoleId(map);
	}
	
    
	/**
	 * DESC： 删除系统功能
	 * @auther 胡义振
	 * @param functionId 系统功能ID
	 * @return 
	 * @throws Exception
	 */
    @Override
	public Integer doRmFunctionById(String functionIds) throws Exception
	{
		if (functionIds == null)  functionIds = "";
		String[] arrFunctionId = functionIds.split(",");
		for(String functionId : arrFunctionId){
			// 删除角色-功能表中的对应关系
			sysRoleFunctionDao.deleteRoleFunctionByFunctionId(functionId);
			// 删除功能表
			sysFunctionDao.deleteById(functionId);
		}
		return 0;
	}

    /**
     * Desc: 功能列表转为JSONObject 
     * @param listSysFunctionList
     * @return
     * @throws Exception
     * Date: 2020年1月14日
     * Author: Administrator
     */
    @Override
    public List<JSONObject> doExchangeFunctionListToJson(List<SysFunction> listSysFunction) throws Exception {
		List<JSONObject> listParentSysFunctionJSONObject = new ArrayList<>();
		List<SysFunction> parentSysFunctionList = null;
		
		if(listSysFunction!=null) {
			// 获取根节点
			parentSysFunctionList = listSysFunction.stream().filter( t -> t.getParentId().equals("0")).collect(Collectors.toList());
			// 添加每个根节点所有节点
			parentSysFunctionList.stream().forEach(t -> {
				try {
					JSONObject treeObject = new JSONObject(true);
					treeObject.put("id", t.getId());
					treeObject.put("ownerFlag", t.getOwnerFlag());
					treeObject.put("parentId", t.getParentId());
					treeObject.put("functionName", t.getFunctionName());
					treeObject.put("functionUrl", t.getFunctionUrl());
					treeObject.put("functionIntroduce", t.getFunctionIntroduce());
					treeObject.put("functionOrderNum", t.getFunctionOrderNum());
					treeObject.put("menuFlag", t.getMenuFlag());
					treeObject.put("menuStyle", t.getMenuStyle());
					// 当前节点功能列表（功能节点没有子节点，不需要递归）
					treeObject.put("functionList", getNodeFunctionList(listSysFunction,t.getId()));
					// 子节点（递归所有子节点）
					treeObject.put("children", getChildrenMenuJSONObject(listSysFunction,t.getId()));
					listParentSysFunctionJSONObject.add(treeObject);
				} catch (Exception e) {
					e.printStackTrace();
				}
				
			});
		}
		return listParentSysFunctionJSONObject;
    }
    
    /**
     * Desc: 递归获取子节点
     * @param listSysFunctionList
     * @param parentId
     * @return
     * @throws Exception
     * Date: 2020年1月14日
     * Author: Administrator
     */
	private List<JSONObject> getChildrenMenuJSONObject(List<SysFunction> listSysFunction,String parentId) throws Exception  {
		List<JSONObject> listChildrenSysFunctionJSONObject = new ArrayList<>();
		List<SysFunction> childrenFunctionList = null;
		if(listSysFunction!=null) {
			// 子节点列表
			childrenFunctionList = listSysFunction.stream().filter( t -> t.getParentId().equals(parentId))
					.filter(t -> t.getMenuFlag().equals(FuntionTypeEnum.FLAG_TYPE_MENU.getCode())).collect(Collectors.toList());
			// 遍历子节点
			if(childrenFunctionList!=null) {
				childrenFunctionList.stream().forEach(t -> {
					try {
						JSONObject treeObject = new JSONObject(true);
						treeObject.put("id", t.getId());
						treeObject.put("ownerFlag", t.getOwnerFlag());
						treeObject.put("parentId", t.getParentId());
						treeObject.put("functionName", t.getFunctionName());
						treeObject.put("functionUrl", t.getFunctionUrl());
						treeObject.put("functionIntroduce", t.getFunctionIntroduce());
						treeObject.put("functionOrderNum", t.getFunctionOrderNum());
						treeObject.put("menuFlag", t.getMenuFlag());
						treeObject.put("menuStyle", t.getMenuStyle());
						// 当前节点功能列表（功能节点没有子节点，不需要递归）
						treeObject.put("functionList", getNodeFunctionList(listSysFunction,t.getId()));
						// 子节点（递归所有子节点）
						treeObject.put("children", getChildrenMenuJSONObject(listSysFunction,t.getId()));
						listChildrenSysFunctionJSONObject.add(treeObject);
					} catch (Exception e) {
						e.printStackTrace();
					}
					
				});
			}
		}
		return listChildrenSysFunctionJSONObject;
	}
	
    /**
     * Desc: 获取节点功能列表
     * @param listSysFunction
     * @param parentId
     * @return
     * @throws Exception
     * Date: 2020年1月14日
     * Author: Administrator
     */
	List<SysFunction> getNodeFunctionList(List<SysFunction> listSysFunction,String parentId) throws Exception  {
		List<SysFunction> childrenFunctionList = null;
		if(listSysFunction!=null) {
			// 子节点列表
			childrenFunctionList = listSysFunction.stream().filter( t -> t.getParentId().equals(parentId))
					.filter(t -> t.getMenuFlag().equals(FuntionTypeEnum.FLAG_TYPE_FUNCTION.getCode())).collect(Collectors.toList());
		}
		return childrenFunctionList;
	}
	/**
	 * 检查菜单名称是否存在
	 * @param functionName
	 * @param functionId
	 * @return
	 * @throws Exception
	 */
	@Override
	public boolean doCheckSysFunctionNameExist(String functionName, String functionId) throws Exception {
		SysFunction sysFunction = new SysFunction();
		sysFunction.setFunctionName(functionName);
		//检测新增菜单名称
		if(functionId!=null && !functionId.equals("")){
			sysFunction.setId(functionId);
		}
		Integer searchCount = sysFunctionDao.selectSysFunctionForCheckFunctionName(sysFunction);
		if(searchCount!=null && searchCount>0){
			return true;
		}
		return false;
	}
}
